class Observer{
    constructor(data){
        this.walk(data)
    }
    walk(data){
        //判断data是否是对象，
        if(!data || typeof data !== 'object'){
            return
        }
        //遍历对象的所有属性
        Object.keys(data).forEach(key => {
            this.defineReactive(data, key, data[key]);
        })
    }
    defineReactive(obj, key, val){    //为什么还需要传递value的值，而不是通过obj[key]的方式取到value的值呢.因为内部使用obj[key]继续调用getter会导致循环调用
        let that = this;
        //负责收集依赖，并发送通知
        let dep = new Dep();

        //如果val值是对象的话，也需要注册成响应式的
        this.walk(val);
        Object.defineProperty(obj,key,{
            enumerable:true,
            configurable:true,
            get(){
                //收集依赖。通过Dep的类方法的成员targe来进行判断
                Dep.target && dep.addSub(Dep.target);
                return val;
            },
            set(newVal){
                if (newVal == val) {
                    return
                }
                val = newVal;
                that.walk(newVal);
                //发送通知
                dep.notify();
            }
        })
    }
}